/**
 * <h3>CooperationServiceImpl</h3>
 * <p> 文创合作服务实现类 </p>
 *
 * <h3>功能描述</h3>
 * <p> 实现了 {@link ICooperationService} 接口中定义的文创合作信息增删改查业务逻辑 </p>
 * <p> 通过调用 {@link CooperationMapper} 完成对数据库的操作，支持条件查询、按ID查询、更新、新增和删除等操作 </p>
 *
 * <h3>元数据</h3>
 * <ul>
 *    <li> 作者：郭强</li>
 *    <li> 创建日期：2025年05月17日 14:34:42 </li>
 * </ul>
 *
 * <h3>其他信息</h3>
 * <ul>
 *    <li> 参考链接：<a href="https://example.com">官方网页</a></li>
 *    <li> 示例代码：{@code new CooperationServiceImpl()} </li>
 * </ul>
 *
 * @apiNote 该类基于 MyBatis Plus 的 ServiceImpl 实现，需确保 CooperationMapper 正确注入
 * @implSpec 继承自 {@link ServiceImpl<CooperationMapper, CooperationDTO>} 并实现 {@link ICooperationService} 接口
 * @since 1.0.0
 */

package com.dnndo.system.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dnndo.common.core.domain.entity.SysRole;
import com.dnndo.common.core.domain.entity.SysUser;
import com.dnndo.system.domain.dto.CooperationDTO;
import com.dnndo.system.domain.dto.EnerateApiDTO;
import com.dnndo.system.domain.dto.GenerateDTO;
import com.dnndo.system.domain.vo.GenerateVO;
import com.dnndo.system.mapper.CooperationMapper;
import com.dnndo.system.mapper.CreateMapper;
import com.dnndo.system.mapper.SysRoleMapper;
import com.dnndo.system.mapper.SysUserMapper;
import com.dnndo.system.service.ICooperationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

import static com.dnndo.common.utils.SecurityUtils.getUserId;

/**
 * 文创合作服务实现类
 */
@Service
public class CooperationServiceImpl extends ServiceImpl<CooperationMapper, CooperationDTO> implements ICooperationService {

    private final CooperationMapper cooperationMapper;
    private final SysRoleMapper sysRoleMapper;
    private final SysUserMapper sysUserMapper;
    private final CreateMapper createMapper;

    @Autowired
    public CooperationServiceImpl(CooperationMapper cooperationMapper,SysRoleMapper sysRoleMapper, SysUserMapper sysUserMapper
                                ,CreateMapper createMapper) {
        this.cooperationMapper = cooperationMapper;
        this.sysRoleMapper = sysRoleMapper;
        this.sysUserMapper = sysUserMapper;
        this.createMapper = createMapper;
    }

    /**
     * 查询文创合作列表（按用户角色分支）
     * 逻辑说明：
     * 1. 获取当前用户的角色Key集合（如school、common、admin等）。
     * 2. 设置用户所属学校ID到DTO，确保数据隔离。
     * 3. 如果用户为school或common角色，只能查询本校合作信息（调用selectCooperationListSchool）。
     * 4. 如果为admin角色，可查询所有合作信息（调用selectCooperationList）。
     * 5. 返回最终结果。
     *
     * @param dto 查询条件，包含用户ID等
     * @return List<CooperationDTO> 合作信息列表
     */
    @Override
    public List<CooperationDTO> selectCooperationList(CooperationDTO dto) {
        List<CooperationDTO> cooperationList = new ArrayList<>();
        // 获取当前用户的所有角色Key
        List<String> roleKeys = getUserRoleKeys(dto.getUserId());
        // 设置用户所属学校ID到DTO
        setUserSchoolId(dto);

        // 按角色分支查询
        if (roleKeys.contains("school") || roleKeys.contains("common")) {
            // 学校用户或普通用户只能查本校合作
            cooperationList = cooperationMapper.selectCooperationListSchool(dto);
        } else if (roleKeys.contains("admin")) {
            // 管理员可查所有合作
            cooperationList = cooperationMapper.selectCooperationList(dto);
        }
        return cooperationList;
    }

    //    获取角色key
    private List<String> getUserRoleKeys(Integer userId) {
        List<SysRole> roles = sysRoleMapper.selectRolePermissionByUserId(userId.longValue());
        return roles.stream().map(SysRole::getRoleKey).toList();
    }

    //    获取用户所属学校
    private void setUserSchoolId(CooperationDTO dto) {
        SysUser user = sysUserMapper.selectUserById(dto.getUserId().longValue());
        dto.setSchoolId(Integer.valueOf(user.getSchoolId()));
    }

    /**
     * 根据合作ID查询合作详情，并附加当前用户角色和ID
     * 逻辑说明：
     * 1. 获取当前用户的角色Key集合。
     * 2. 查询指定ID的合作详情。
     * 3. 将当前用户ID和角色Key注入到返回对象，便于前端权限判断。
     * 4. 仅管理员角色注入admin标识。
     *
     * @param cooperateId 合作唯一标识符
     * @param uId 当前登录用户ID
     * @return CooperationDTO 合作详情，含用户权限信息
     */
    @Override
    public CooperationDTO selectCooperationById(Long cooperateId, Long uId) {
        List<String> roleKeys = getUserRoleKeys(uId.intValue());
        CooperationDTO cooperationDTO = cooperationMapper.selectCooperationListById(cooperateId);
        cooperationDTO.setUid(uId.intValue());
        if (roleKeys.contains("admin")) {
            cooperationDTO.setRoleKey("admin");
        }
        return cooperationDTO;
    }

    @Override
    public int updateCooperationById(CooperationDTO cooperateDTO) {
        return cooperationMapper.updateCooperationById(cooperateDTO);
    }

    /**
     * 新增文创合作信息，默认contact字段为0
     * 逻辑说明：
     * 1. 新增时将contact字段初始化为0，表示未联系。
     * 2. 调用Mapper插入方法，写入数据库。
     *
     * @param cooperateDTO 合作数据对象
     * @return int 受影响的数据库记录数，1表示插入成功
     */
    @Override
    public int insertCooperation(CooperationDTO cooperateDTO) {
        cooperateDTO.setContact(0);
        return cooperationMapper.insertCooperation(cooperateDTO);
    }

    @Override
    public int deleteCooperationById(Integer cooperateId) {
        return cooperationMapper.deleteCooperationById(cooperateId);
    }


    /**
     * 生成AI方案模拟记录（共22条）
     * 逻辑说明：
     * 1. 固定生成22条方案数据，模拟AI生成效果。
     * 2. 每条数据包含ID、标题（中英文）、图片URL、点赞状态等。
     * 3. 偶数ID设置为已点赞，奇数为未点赞。
     * 4. 图片URL为固定前缀拼接ID。
     *
     * @param dto 查询参数（可扩展）
     * @return List<GenerateVO> 方案模拟数据列表
     */
    @Override
    public List<GenerateVO> selectqueryrecords(GenerateDTO dto) {
        List<GenerateVO> result = new ArrayList<>();

        String baseUrl = "http://47.94.47.155:8000/static/ai/";

        Long userId = null;
        try {
            userId = getUserId();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 只有 userId 有效时才查询点赞记录
        List<EnerateApiDTO> list = new ArrayList<>();
        if (userId != null) {
            list = createMapper.selectwork(userId);
        }

        for (int i = 1; i <= 22; i++) {
            GenerateVO vo = new GenerateVO();
            vo.setId(i);
            vo.setTitle("方案" + i);
            vo.setTitleEn("Fang an" + i); // 可选英文标题
            vo.setImg(baseUrl + i + ".jpg");
            boolean isThumb = false;
            for (EnerateApiDTO Edto : list) {
                if (Edto.getCreateId() != null &&Edto.getCreateId().intValue() == i) {
                    isThumb = true;
                    break;
                }
            }
            vo.setThumb(isThumb);
            result.add(vo);
        }

        return result;
    }

}
